#define SEG_KCODE 1  // kernel code
#define SEG_KDATA 2  // kernel data+stack
#define SEG_KCPU  3  // kernel per-cpu data

.globl alltraps
alltraps:
	# Build trap frame.
	pushl %ds
	pushl %es
	pushl %fs
	pushl %gs
	pushal
  
	# Set up data and per-cpu segments.
	movw $(SEG_KDATA<<3), %ax
	movw %ax, %ds
	movw %ax, %es
	movw $(SEG_KCPU<<3), %ax
	movw %ax, %gs
	movw $0, %ax
	movw %ax, %fs

	# Call trap(tf), where tf=%esp
	pushl %esp
	call trap
	# pop func arg
	addl $4, %esp

	# Return falls through to trapret...
.globl trapret
trapret:
	cli
	call vm_swtch_uvm
	popal
	popl %gs
	popl %fs
	popl %es
	popl %ds
	addl $0x8, %esp  # trapno and errcode
	iret

